// 版权所有2011 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package user

import "sync"

// Current返回当前用户。
// 
// 第一次调用将缓存当前用户信息。
// 后续调用将返回缓存的值，不会反映对当前用户的更改。
func Current() (*User, error) {
	cache.Do(func() { cache.u, cache.err = current() })
	if cache.err != nil {
		return nil, cache.err
	}
	u := *cache.u // 复制
	return &u, nil
}

// 当前用户的缓存
var cache struct {
	sync.Once
	u   *User
	err error
}

// 查找按用户名查找用户。如果找不到用户，则返回的
// 错误类型为UnknownUserError。
func Lookup(username string) (*User, error) {
	if u, err := Current(); err == nil && u.Username == username {
		return u, err
	}
	return lookupUser(username)
}

// LookupId通过userid查找用户。如果找不到用户，则返回的
// 错误类型为UnknownUserError。
func LookupId(uid string) (*User, error) {
	if u, err := Current(); err == nil && u.Uid == uid {
		return u, err
	}
	return lookupUserId(uid)
}

// LookupGroup按名称查找组。如果找不到组，则返回的
// 错误类型为UnknownGroupError。
func LookupGroup(name string) (*Group, error) {
	return lookupGroup(name)
}

// LookupGroupId按groupid查找组。如果找不到该组，则返回的
// 错误类型为UnknownGroupIdError。
func LookupGroupId(gid string) (*Group, error) {
	return lookupGroupId(gid)
}

// GroupIds返回用户所属的组ID列表。
func (u *User) GroupIds() ([]string, error) {
	return listGroups(u)
}
